package com.cictec.middleware.tde.rm.protocol.rm.encode;

import java.nio.ByteBuffer;

import com.cictec.middleware.commons.utils.BinaryUtils;
import com.cictec.middleware.commons.utils.gps.GpsUtils;
import com.cictec.middleware.tde.exception.MessageEncoderException;
import com.cictec.middleware.tde.rm.protocol.AbstractMessageEncoder;
import com.cictec.middleware.tde.rm.protocol.TerminalMessage;
import com.cictec.middleware.tde.rm.protocol.annotion.TerminalMessageEncoder;
import com.cictec.middleware.tde.rm.protocol.rm.message.Rm0x02TerminalMessage;
import com.cictec.middleware.tde.rm.protocol.rm.utils.RmBinaryUtils;


/**
 *   0x02  上传 GPS  定位数据
 *
 */
@TerminalMessageEncoder(0x02)
public class Rm0x02Encoder extends AbstractMessageEncoder{

	
	@Override
	public byte[] encode(TerminalMessage message) throws MessageEncoderException {
		Rm0x02TerminalMessage msg = (Rm0x02TerminalMessage)message;
		
		ByteBuffer out = ByteBuffer.allocate(256);
		RmBinaryUtils.setLatOrLngByteDataRM(out, GpsUtils.formatLongitude(String.valueOf(msg.getLat()), "dm"));
		RmBinaryUtils.setLatOrLngByteDataRM(out, GpsUtils.formatLongitude(String.valueOf(msg.getLng()), "dm"));
		
		out.put(BinaryUtils.intToUnsignedByte(msg.getSpeed()));
		out.put(BinaryUtils.intToUnsignedByte(msg.getAngle()));
		out.put(BinaryUtils.intToWord(msg.getAltitude()));
		out.put(BinaryUtils.intToUnsignedByte(msg.getBusTemperature()));
		out.put(BinaryUtils.intToUnsignedByte(msg.getEngineTemperature()));
		out.put(BinaryUtils.longToDword(msg.getGpsOdometer()));
		out.put(BinaryUtils.intToUnsignedByte(msg.getCanBusProtocol()));
		out.put(BinaryUtils.intToUnsignedByte(msg.getCanBusDataLongth()));
//		out.put(BinaryUtils.intToUnsignedByte(msg.getCanBusDataLongth()));//为0时候没有该字段
		out.put(BinaryUtils.intToWord(msg.getVoltage1()));
		out.put(BinaryUtils.intToWord(msg.getCurrent1()));
		out.put(BinaryUtils.intToWord(msg.getPower1()));
		out.put(BinaryUtils.longToDword(msg.getEnergy1()));
		out.put(BinaryUtils.intToWord(msg.getVoltage2()));
		out.put(BinaryUtils.intToWord(msg.getCurrent2()));
		out.put(BinaryUtils.intToWord(msg.getPower2()));
		out.put(BinaryUtils.longToDword(msg.getEnergy2()));
		out.put(BinaryUtils.longToDword(msg.getTemperature()));
		out.put(BinaryUtils.longToDword(msg.getHumidity()));
		out.put(BinaryUtils.longToDword(msg.getReserved1()));
		out.put(BinaryUtils.intToUnsignedByte(msg.getPositionModel()));
		out.put(BinaryUtils.intToWord(msg.getReserved2()));
		
		// 24 24 54 20 53 02 59 08 AC A4 00 00 EB 03 22 27 22 1F AB 74 2D 0C 2F 00 24 00 00 00 00 00 9B 39 32 01 30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 AC 23 23
		/*
		 * 经纬度为 4 字节 16 进制数据，
		 * 第一字节为度，第二字节为分，第三和第四字节为分的小数位、
		 * 	其中:
		 * 		第三字节为分小数点后第 1、2 位绝对数值的 16 进制数，
		 * 		第四字节为分小数点后第 3、4 位绝对数值的 16 进制数。经纬度精确到分的小数点后 4 位 
		 */
		/*
		// 纬度(格式ddmm.mmmm:即dd 度，mm.mmmm 分)；		N/S(北纬或南纬)：北纬38 度52.9276 分；38.529276
		// 经度(格式dddmm.mmmm：即ddd 度，mm.mmmm 分)；	E/W(东经或西经)：东经115 度27.4283 分；115.274283
		String orgLat = String.valueOf(msg.getLat());
		String latformat = GpsUtils.formateLatitude(orgLat, "dm");
		String[] orglatArray = latformat.split(",");
		String ddlat = orglatArray[0];
		String mmlat = orglatArray[1];
		int mmIndex = mmlat.lastIndexOf(".");//查找小数点的位置
		
		int latdd = Integer.valueOf(ddlat);							// 第一字节为度
		int latmm = Integer.valueOf(mmlat.substring(0, mmIndex));		// 第二字节为分
//		int latmm12 = Integer.valueOf(mmlat.substring(mmIndex+1, mmIndex+3));// 第三字节为分小数点后第 1、2 位绝对数值的 16 进制数
//		int latmm34 = Integer.valueOf(mmlat.substring(mmIndex+3, mmIndex+5));		// 第四字节为分小数点后第 3、4 位绝对数值的 16 进制数
		int latmm1234 = Integer.valueOf(mmlat.substring(mmIndex+1, mmIndex+5));		// 第四字节为分小数点后第 1、2 、3、4位绝对数值的 16 进制数
		out.put(BinaryUtils.intToUnsignedByte(latdd)); 	// 第一字节为度
		out.put(BinaryUtils.intToUnsignedByte(latmm)); 	// 第二字节为分
//		out.put(BinaryUtils.intToUnsignedByte(latmm12)); // 第三字节为分小数点后第 1、2 位绝对数值的 16 进制数
//		out.put(BinaryUtils.intToUnsignedByte(latmm34)); // 第四字节为分小数点后第 3、4 位绝对数值的 16 进制数
		out.put(BinaryUtils.intToWord(latmm1234)); 		// 第三、四字节为分小数点后第 1、2 、3、4 位绝对数值的 16 进制数
		
		
		
		String orglng = String.valueOf(msg.getLng());
		String lngformat = GpsUtils.formatLongitude(orglng, "dm");
		String[] orglngArray = lngformat.split(",");
		String ddlng = orglngArray[0];
		String mmlng = orglngArray[1];
		int lngidx = mmlng.lastIndexOf(".");
		
		int lngdd = Integer.valueOf(ddlng);			
		int lngmm = Integer.valueOf(mmlng.substring(0, lngidx));	
//		int lngmm12 = Integer.valueOf(lngformat.substring(lngidx+3, lngidx+5));	
//		int lngmm34 = Integer.valueOf(lngformat.substring(lngidx+5));			
		int lngmm1234 = Integer.valueOf(mmlng.substring(lngidx+1, lngidx+5));			
		
		out.put(BinaryUtils.intToUnsignedByte(lngdd)); 	// 第一字节为度
		out.put(BinaryUtils.intToUnsignedByte(lngmm)); 	// 第二字节为分
//		out.put(BinaryUtils.intToUnsignedByte(lngmm12)); // 第三字节为分小数点后第 1、2 位绝对数值的 16 进制数
//		out.put(BinaryUtils.intToUnsignedByte(lngmm34)); // 第四字节为分小数点后第 3、4 位绝对数值的 16 进制数
		out.put(BinaryUtils.intToWord(lngmm1234)); 		// 第三字节为分小数点后第 1、2 位绝对数值的 16 进制数
		 */
		
		return toBytes(out);
	}


}
